/**
  ******************************************************************************
  * @file    sysio.c
  * @brief   This file provides code for the configuration
  *          of all used GPIO pins.
  ******************************************************************************
  * @attention
  *
  ******************************************************************************
  */

/* Includes ------------------------------------------------------------------*/
#include "bsp.h"
#include "tskcfg.h"

/** Configure pins as
        * Analog
        * Input
        * Output
        * EVENT_OUT
        * EXTI
*/
void SysIO_Init(void)
{
  LL_EXTI_InitTypeDef EXTI_InitStruct = {0};
  LL_GPIO_InitTypeDef GPIO_InitStruct = {0};

  /* GPIO Ports Clock Enable */
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOC);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOH);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOB);
  LL_AHB2_GRP1_EnableClock(LL_AHB2_GRP1_PERIPH_GPIOA);

  /**/
  LL_GPIO_ResetOutputPin(LED1_GPIO_Port, LED1_LL_Pin);
//  LL_GPIO_ResetOutputPin(LED2_GPIO_Port, LED2_LL_Pin);
  LL_GPIO_ResetOutputPin(LED3_GPIO_Port, LED3_LL_Pin);

//  GPIO_InitStruct.Pin = LED2_LL_Pin;
//  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
//  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
//  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
//  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
//  LL_GPIO_Init(LED2_GPIO_Port, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LED3_LL_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(LED3_GPIO_Port, &GPIO_InitStruct);

  GPIO_InitStruct.Pin = LED1_LL_Pin;
  GPIO_InitStruct.Mode = LL_GPIO_MODE_OUTPUT;
  GPIO_InitStruct.Speed = LL_GPIO_SPEED_FREQ_MEDIUM;
  GPIO_InitStruct.OutputType = LL_GPIO_OUTPUT_PUSHPULL;
  GPIO_InitStruct.Pull = LL_GPIO_PULL_UP;
  LL_GPIO_Init(LED1_GPIO_Port, &GPIO_InitStruct);
  
  
  LL_SYSCFG_SetEXTISource(LL_SYSCFG_EXTI_PORTC, LL_SYSCFG_EXTI_LINE13);
  
  EXTI_InitStruct.Line_0_31 = WAKEUP_KEY2_EXTI_LINE;
  EXTI_InitStruct.Line_32_63 = LL_EXTI_LINE_NONE;
  EXTI_InitStruct.LineCommand = ENABLE;
  EXTI_InitStruct.Mode = LL_EXTI_MODE_IT;
  EXTI_InitStruct.Trigger = LL_EXTI_TRIGGER_RISING;
  LL_EXTI_Init(&EXTI_InitStruct);

  LL_GPIO_SetPinPull(WAKEUP_KEY2_GPIO_Port, WAKEUP_KEY2_Pin, LL_GPIO_PULL_DOWN);
  LL_GPIO_SetPinMode(WAKEUP_KEY2_GPIO_Port, WAKEUP_KEY2_Pin, LL_GPIO_MODE_INPUT);
  
    /* EXTI interrupt init*/
  NVIC_SetPriority(WAKEUP_KEY2_EXTI_IRQn, NVIC_EncodePriority(NVIC_GetPriorityGrouping(),WAKEUP_KEY2_IRQn_PRIORITY, 0));
  NVIC_EnableIRQ(WAKEUP_KEY2_EXTI_IRQn);
}

void EXTI15_10_IRQHandler(void)
{
  if(LL_EXTI_IsActiveFlag_0_31(WAKEUP_KEY2_EXTI_LINE) != RESET)
  {
    LL_EXTI_ClearFlag_0_31(WAKEUP_KEY2_EXTI_LINE);
    
//    LED2_Toggle();
    
    vTaskNotifyGiveFromISR(xKey_Thd, NULL);
  }
}
